package {
    import flare.data.DataSet;
    import flare.data.DataSource;
    import flare.display.TextSprite;
    import flare.vis.Visualization;
    import flare.vis.data.Data;
    import flare.vis.data.DataSprite;
    import flare.vis.data.EdgeSprite;
    import flare.vis.operator.label.Labeler;
    import flare.vis.operator.layout.RadialTreeLayout;
    
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import flash.net.URLLoader;
    import flash.text.TextFormat; 
  
    [SWF(width="800", height="600", backgroundColor="#ffffff", frameRate="30")]
    public class Tutorial extends Sprite
    {
        private var vis:Visualization;
 
        public function Tutorial()        
        {	
        	//adicionando título
        	var titulo:TextSprite = new TextSprite("Relacionamentos");
        	titulo.x = 50;
        	titulo.y = 20;
        	titulo.size = 25;        
        	//titulo.color = 0x003366;	
        	titulo.font = "Verdana";        	
        	addChild(titulo);
        	//adicionando criador
        	var criador:TextSprite = new TextSprite("Desenvolvido por Nakamura");
        	criador.x = 500;
        	criador.y = 500;
        	criador.size = 12;
        	criador.italic = true;       	       
        		        	
        	addChild(criador);        	
        	
            loadData();
        }
 
        private function loadData():void
        {
            var ds:DataSource = new DataSource(
                "http://www.inf.ufrgs.br/~rncarneiro/graph.txt", "graphml");
            var loader:URLLoader = ds.load();
            loader.addEventListener(Event.COMPLETE, function(evt:Event):void {
                var ds:DataSet = loader.data as DataSet;
                visualize(Data.fromDataSet(ds));
            });
        }
 	
        private function visualize(data:Data):void
        {
        	
            vis = new Visualization(data);
            vis.bounds = new Rectangle(0, 0, 800, 600);
            vis.x = 100;
            vis.y = 50;
            addChild(vis);           
            
            //setando as propriedades de cada EdgeSprite
            vis.data.edges.setProperties({"arrowType":"triangle", 
            							  "arrowWidth":10,			
            							  "arrowHeight":10,
            							  "lineWidth":2            							 
            });
 			vis.data.nodes.setProperties({"shape":null});
 			
 			//adicionando o operador que desenha o grafo
 			//vis.operators.add(new NodeLinkTreeLayout(Orientation.TOP_TO_BOTTOM,100,100,100));
 			var circulo:RadialTreeLayout = new RadialTreeLayout();
 			circulo.radiusIncrement = 1; 			
 			circulo.layoutBounds = new Rectangle(20,20,250,250);//\todo verificar os limites
 			//circulo.autoScale = true;
 			vis.operators.add(circulo);
 			
			//adicionando labels para os nodos 			
 			var fonte:TextFormat = new TextFormat("Verdana",14,null,true);		
 			vis.operators.add(new Labeler(
 											function(d:DataSprite):String{ 													
 													var saida:String = d.data.nome;
 													return saida;
 											},"nodes",fonte));
 											
 											
 			//Adicionando labels para as arestas			
 			var fmt:TextFormat = new TextFormat("Verdana",9,0x000002);					 			
 					
 			vis.operators.add(new Labeler("data.tipo",Data.EDGES,fmt,EdgeSprite,Labeler.LAYER));
 			vis.data.edges.visit(function(es:EdgeSprite):void {
				es.addEventListener(Event.RENDER,updateEdgeLabelPosition);
			});
 			
         
            vis.update();
            
        }
                
        //Posiciona o label na posição correta em relação a aresta(edge)
        private function updateEdgeLabelPosition(evt:Event):void {
			var es:EdgeSprite = evt.target as EdgeSprite;
			es.props.label.x = (es.source.x + es.target.x) / 2;
			es.props.label.y = (es.source.y + es.target.y) / 2;	
		}

    }
}